import os
from .ssh_manager import SSHManager

class FileManager:
    def __init__(self):
        self.ssh_manager = SSHManager()
        
    def list_remote_files(self, path=''):
        """列出远程服务器上的文件"""
        try:
            # 构建完整路径
            full_path = os.path.join(self.ssh_manager.config["paths"]["source_path"], path)
            
            # 使用ls -la命令获取详细信息
            cmd = f'ls -la {full_path}'
            result = self.ssh_manager.execute_command(cmd)
            
            if result['status'] != 0:
                print(f"执行命令失败: {result['error']}")
                return []
            
            # 解析输出
            lines = result['output'].strip().split('\n')
            files = []
            
            # 跳过第一行（total信息）
            for line in lines[1:]:
                parts = line.split()
                if len(parts) < 9:
                    continue
                    
                # 获取文件类型和权限
                permissions = parts[0]
                is_dir = permissions.startswith('d')
                
                # 获取文件大小
                size = parts[4]
                
                # 获取修改时间
                mtime = f"{parts[5]} {parts[6]} {parts[7]}"
                
                # 获取文件名（处理带空格的文件名）
                filename = ' '.join(parts[8:])
                
                # 跳过 . 和 .. 目录
                if filename in ['.', '..']:
                    continue
                
                # 格式化输出
                file_type = "📁" if is_dir else "📄"
                file_info = f"{file_type} {filename}"
                
                files.append({
                    'name': filename,
                    'type': 'directory' if is_dir else 'file',
                    'size': size,
                    'mtime': mtime,
                    'display': file_info
                })
            
            print(f"找到 {len(files)} 个文件/文件夹")
            return files
            
        except Exception as e:
            print(f"列出远程文件时出错: {str(e)}")
            return []
    
    def _human_readable_size(self, size_in_bytes):
        """将字节数转换为人类可读的格式"""
        try:
            for unit in ['B', 'KB', 'MB', 'GB', 'TB']:
                if size_in_bytes < 1024.0:
                    return f"{size_in_bytes:.1f}{unit}"
                size_in_bytes /= 1024.0
            return f"{size_in_bytes:.1f}PB"
        except Exception as e:
            return "0B"  # 如果转换失败，返回默认值
    
    def list_destination_files(self, path=''):
        """列出目标服务器上的文件和文件夹"""
        try:
            dest_path = self.ssh_manager.config["paths"]["destination_path"]
            if path:
                dest_path = os.path.join(dest_path, path)
            
            # 检查目录是否存在，不存在则返回空列表
            if not os.path.exists(dest_path):
                print(f"目标目录不存在: {dest_path}")
                return []
                
            files = []
            for item in os.listdir(dest_path):
                item_path = os.path.join(dest_path, item)
                relative_path = os.path.join(path, item) if path else item
                
                if os.path.isdir(item_path):
                    # 如果是目录，获取目录内容
                    try:
                        dir_contents = os.listdir(item_path)
                        files.append({
                            'name': item,
                            'type': 'directory',
                            'path': relative_path,
                            'size': len(dir_contents),
                            'mtime': os.path.getmtime(item_path),
                            'display': f"📁 {item}"
                        })
                    except Exception as e:
                        print(f"读取目录 {item_path} 失败: {str(e)}")
                        files.append({
                            'name': item,
                            'type': 'directory',
                            'path': relative_path,
                            'size': 0,
                            'mtime': 0,
                            'display': f"📁 {item} (无法访问)"
                        })
                else:
                    # 如果是文件，获取文件信息
                    try:
                        file_size = os.path.getsize(item_path)
                        files.append({
                            'name': item,
                            'type': 'file',
                            'path': relative_path,
                            'size': self._human_readable_size(file_size),
                            'mtime': os.path.getmtime(item_path),
                            'display': f"📄 {item}"
                        })
                    except Exception as e:
                        print(f"读取文件 {item_path} 失败: {str(e)}")
                        files.append({
                            'name': item,
                            'type': 'file',
                            'path': relative_path,
                            'size': '0B',
                            'mtime': 0,
                            'display': f"📄 {item} (无法访问)"
                        })
            
            # 按类型和名称排序
            files.sort(key=lambda x: (x['type'] != 'directory', x['name'].lower()))
            return files
            
        except Exception as e:
            print(f"列出目标文件失败: {str(e)}")
            return []
            
    def transfer_file(self, filename):
        """传输文件"""
        try:
            print(f"\n=== 开始文件传输 ===")
            print(f"文件名: {filename}")
            print(f"配置信息:")
            print(f"  - 源路径: {self.ssh_manager.config['paths']['source_path']}")
            print(f"  - 目标路径: {self.ssh_manager.config['paths']['destination_path']}")
            
            print("\n正在创建 SSH 隧道...")
            with self.ssh_manager.create_tunnel() as ssh:
                print("SSH 隧道创建成功")
                
                print("\n正在打开 SFTP 连接...")
                sftp = ssh.open_sftp()
                print("SFTP 连接成功")
                
                # 构建源文件和目标文件的完整路径
                source_path = os.path.join(self.ssh_manager.config["paths"]["source_path"], filename)
                dest_path = os.path.join(self.ssh_manager.config["paths"]["destination_path"], filename)
                
                print("\n路径信息:")
                print(f"  - 完整源路径: {source_path}")
                print(f"  - 完整目标路径: {dest_path}")
                
                # 确保目标目录存在
                dest_dir = os.path.dirname(dest_path)
                print(f"\n检查目标目录: {dest_dir}")
                if not os.path.exists(dest_dir):
                    print("目标目录不存在，正在创建...")
                    os.makedirs(dest_dir)
                    print("目标目录创建成功")
                else:
                    print("目标目录已存在")
                
                # 使用 SFTP 检查远程文件是否存在
                print(f"\n检查远程文件: {source_path}")
                try:
                    file_stat = sftp.stat(source_path)
                    print(f"远程文件存在:")
                    print(f"  - 大小: {self._human_readable_size(file_stat.st_size)}")
                    print(f"  - 权限: {file_stat.st_mode}")
                    print(f"  - 修改时间: {file_stat.st_mtime}")
                except FileNotFoundError:
                    print(f"远程文件不存在: {source_path}")
                    # 尝试列出目录内容以确认目录是否存在
                    parent_dir = os.path.dirname(source_path)
                    print(f"\n检查父目录: {parent_dir}")
                    try:
                        dir_contents = sftp.listdir(parent_dir)
                        print(f"远程目录存在，包含 {len(dir_contents)} 个文件/文件夹:")
                        for item in dir_contents:
                            print(f"  - {item}")
                        raise Exception(f"源文件不存在: {source_path}")
                    except FileNotFoundError:
                        print(f"远程目录不存在: {parent_dir}")
                        raise Exception(f"源目录不存在: {parent_dir}")
                    except Exception as e:
                        print(f"检查远程目录时出错: {str(e)}")
                        raise Exception(f"检查远程目录失败: {str(e)}")
                
                # 执行文件传输
                print("\n开始传输文件...")
                sftp.get(source_path, dest_path)
                print("文件传输完成")
                
                print("\n关闭 SFTP 连接...")
                sftp.close()
                print("SFTP 连接已关闭")
                
                print("\n=== 文件传输成功 ===")
                return True
                
        except Exception as e:
            print(f"\n=== 文件传输失败 ===")
            print(f"错误信息: {str(e)}")
            raise Exception(f"文件传输失败: {str(e)}")
